package com.spring.lifecycle.config;

import com.spring.lifecycle.service.BoyService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Primary;

/**
 * Title:@Autowired自动注入、装配
 *      自动注入：Spring利用依赖注入（DI），完成IoC容器中各个组件的依赖关系赋值
 *
 * @Autowired 自动注入
 *  运行规则
       默认优先按照类型去容器中找对应的组件
           applicationContext.getBean(BookDao.class);
       相同类型组件，再根据组件id去容器找
           applicationContext.getBean("bookDao");
 *  辅助注解
      @Qualifier
      多个组件，指定需要装配的组件id
          @Qualifier("boyService")  //指定bean的id
          private BoyService boyService2;  //将已有的Service类装配到Controller
       @Autowired(required = false)
      组件不一定存在，设置不一定注入，防止报错（默认一定要将属性赋值好）
          @Autowired(required = false)
          @Qualifier("boyService3")  //指定bean的id
          private BoyService boyService2;  //将已有的Service类装配到Controller
      @Primary
      多个同类型组件，首选一个bean
          @Primary：让Spring进行自动装配的时候，默认使用首选的bean
          注意:使用@Primary需要关闭@Qualifier

 *  其他自动注入方式
 *      @Resource
 *          可以和@Autowired一样实现自动装配功能，
 *          默认是按照组件名称进行装配
 *          没有能支持@Primary功能、没有支持@Autowired(reqiured=false)
 *      @Inject
 *          需要导入javax.inject的包，和Autowired的功能一样
 *          没有@Autowired(reqiured=false)功能
 *       区别
 *          @Autowired：Spring定义的，
 *          @Resource、@Inject都是java的规范
 *          AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能
 */
@ComponentScan({"com.spring.lifecycle.controller","com.spring.lifecycle.service"})
public class AutowiredConfig {

    @Bean("boyService2")
    @Primary //首选
    public BoyService boyService(){
        BoyService boyService = new BoyService();
        boyService.setLable("2");
        return boyService;
    }

}
